/***************************************************************************//**
 * @file     csa37f7x_uart.h
 * @version  V1.0.0
 * @author   Chipsea MCU Group
 * @date     2020-09-26 PM
 * @brief    该文件包含了UART各功能参数的定义和函数接口声明
 * 
 * @copyright Copyright (C) 2020 Chipsea Technologies Corp. All rights reserved.
 ****************************************************************************
 * @attention
 *  硬件平台: CSA37F70 评估板V1.0 \n
 *  SDK版本： CSA37F7X_SDK_1.0.0
 * 
 * @par 修改日志:
 * <table>
 * <tr><th>Date        <th>Version  <th>Author    <th>Description
 * <tr><td>2020-09-26  <td>1.0.0    <td>Chipsea MCU Group  <td>创建初始版本
 * </table>
 *
 *****************************************************************************/

#ifndef __CSA37F7X_UART_H__
#define __CSA37F7X_UART_H__

// Include external header file.
#include "csa37f7x.h"

#ifdef __cplusplus
extern "C" {
#endif


/** @addtogroup UART 串口(UART)
  UART 支持普通速度 UART，并支持自动流程控制。 UART 控制器对从外设收到的数据执行串到并
转换，对来自 CPU 的数据执行并到串的转换。。<br>
###特性: 
    - 全双工，异步通信
    - 独立的接收/发送 16 字节 FIFO
    - 可编程的接收发送缓存触发级数
    - 支持 break 错误，帧错误，奇偶校验错误和接收/ 发送缓冲溢出检测功能
    - 完全可编程的串行接口特性
  @{
*/


/**
* @brief  串口校验模式选择
*/
typedef enum
{
    UART_PARITY_EVEN = 0x00,                                    /*!<偶校验 */ 
    UART_PARITY_ODD=0x01,                                       /*!<奇校验 */ 
}uart_parity_mode_t;

/**
* @brief  串口停止位选择
*/
typedef enum
{
    UART_STOP_BIT_1 = 0x00,                                     /*!<1个停止位 */ 
    UART_STOP_BIT_2 = 0x01,                                     /*!<2个停止位 */ 
}uart_stop_bit_t;

/**
* @brief  串口中断状态选择
*/
typedef enum
{
    UART_INTERRUPT_PTIME = BIT(7),                              /*!<发送完成  */ 
    UART_INTERRUPT_ELSI =BIT(2),                                /*!<接收状态中断使能 */ 
    UART_INTERRUPT_ETBEI = BIT(1),                              /*!<发送状态中断使能 */ 
    UART_INTERRUPT_ERBFI = BIT(0),                              /*!<接收数据有效中断使能 */ 
}uart_interrupt_t ;

/**
* @brief  串口中断ID选择
*/
typedef enum
{
    INTERRUPT_ID_THR = 0x02,                                    /*!<发送寄存器为空  */ 
    INTERRUPT_ID_REC_VALID = 0x04,                              /*!<接收数据有效  */ 
    INTERRUPT_ID_REC_STATUS = 0x06,                             /*!<接收状态  */ 
    INTERRUPT_ID_UART_BUSY = 0x07,                              /*!<BUSY状态  */ 
    INTERRUPT_ID_REC_OVERTIME = 0x0C,                           /*!<超时  */ 
}interrupt_id_t ;

/**
* @brief  串口FIFO接收触发模式选择
*/
typedef enum
{
    FIFO_DATA_NUM_1 = 0x00,                                     /*!<FIFO中有一个数据  */ 
    FIFO_DATA_NUM_QUARTER = 0x01,                               /*!<FIFO 1/4满  */ 
    FIFO_DATA_NUM_HALF = 0x02,                                  /*!<FIFO半满  */ 
    FIFO_DATA_NUM_NEARLY_FULL= 0x03,                            /*!<FIFO还差两个数据就满了  */ 
}uart_fifo_receive_trigger_t ;

/**
* @brief  串口FIFO发送触发模式选择
*/
typedef enum
{
    FIFO_SEND_DATA_NUM_EMPTY = 0x00,                            /*!<FIFO为空  */ 
    FIFO_SEND_DATA_NUM_QUARTER = 0x02,                          /*!<FIFO 1/4满  */ 
    FIFO_SEND_DATA_NUM_HALF = 0x03,                             /*!<FIFO半满  */ 
    FIFO_SEND_DATA_NUM_NEARLY_2=0x01,                           /*!<FIFO有两个数据  */ 
}uart_fifo_send_trigger_t  ;

/**
* @brief  串口FIFO复位模式选择
*/
typedef enum
{
	RESET_RFIFOR= BIT(1),                                       /*!<接收FIFO复位，这个复位控制接收FIFO为空  */ 
    RESET_XFIF0R = BIT(2),                                      /*!<发送FIFO复位，这个复位控制发送FIFO为空  */ 
}fifo_reset_t ;

/**
* @brief  串口状态读取选择
*/
typedef enum
{
    UART_DATA_DR = 0x00,                                        /*!<数据ready位   */ 
    UART_DATA_OE = 0x01,                                        /*!<溢出错位位   */ 
    UART_DATA_PE = 0x02,                                        /*!<奇偶校验错误位   */ 
    UART_DATA_FE = 0x03,                                        /*!<帧错位位   */ 
    UART_BI = 0x04,                                             /*!<中断位   */ 
    UART_THRE = 0x05,                                           /*!<发送保持寄存器为空   */ 
    UART_TEMT = 0x06,                                           /*!<发送为空   */ 
    UART_FIFO_RFE = 0x07,                                       /*!<FIFO接收错误位   */ 
}uart_status_get_t ;

/**
* @brief  串口FIFO状态设置选择
*/
typedef enum
{
    UART_FIFO_RFFE = 0x09,                                      /*!<帧错误检测信息写入FIFO   */ 
    UART_FIFO_RFPE = 0x08,                                      /*!<奇偶校验信息写入FIFO   */ 
    
}uart_fifo_status_set_t ;

/**
* @brief  串口FIFO状态读取选择
*/
typedef enum
{
    UART_BUSY = 0x00,                                           /*!<BUSY状态 */ 
    UART_FIFO_TFNF = 0x01,                                      /*!<发送FIFO不满   */ 
    UART_FIFO_TFF = 0x02,                                       /*!<发送FIFO为空   */ 
    UART_FIFO_DATA_RFNE = 0x03,                                 /*!<接收FIFO为空   */ 
    UART_FIFO_DATA_RFF = 0x04,                                  /*!<接收FIFO满   */ 
}uart_fifo_status_get_t;

/**
* @brief  串口字长选择
*/
typedef enum
{
    UART_DATA_LENGTH_5BIT = 0x00,                               /*!<数据长度为5   */ 
    UART_DATA_LENGTH_6BIT = 0x01,                               /*!<数据长度为6   */ 
    UART_DATA_LENGTH_7BIT = 0x02,                               /*!<数据长度为7   */ 
    UART_DATA_LENGTH_8BIT = 0x03,                               /*!<数据长度为8   */ 
}uart_datalength_t;

/**
* @brief  串口配置结构体
*/
typedef struct
{
    uint32_t uart_baudrate_data;                                /*!<波特率   */ 
	uart_datalength_t uart_data_length;                         /*!<字长   */ 
    uart_stop_bit_t uart_stop_bit;                              /*!<停止位   */ 
    enable_state_t uart_parity_enable_ctrl;                     /*!<校验使能   */ 
    enable_state_t uart_parity_odd_even_ctrl;	                /*!<奇偶校验码产生控制位   */ 
    uart_parity_mode_t uart_parity_select;                      /*!<当使能奇偶校验时选择的校验方式   */ 
} uart_config_t;


/**
* @brief  串口FIFO配置结构体
*/
typedef struct
{
    uart_fifo_receive_trigger_t fifo_data_num_receive;          /*!<FIFO接收触发 */ 
    uart_fifo_send_trigger_t fifo_data_num_send;                /*!<FIFO发送触发 */ 
    fifo_reset_t fifo_reset;                                    /*!<接收FIFO复位 */ 
    enable_state_t fifo_reset_enable;                           /*!<FIFO复位使能 */ 
    enable_state_t fifo_enable;                                 /*!<FIFO使能 */ 
}uart_fifo_config_t;

/**@brief		    串口初始化
 *
 * @param[in]	    p_uart_config     串口配置结构体
 * @return		    无
*/
void uart_init ( uart_config_t *p_uart_config);

/**@brief		    串口数据接收
 *
 * @return		    接收的数据
*/
uint8_t uart_data_receive(void);

/**@brief		    串口数据发送
 *
 * @param[in]	    data_send     串口待发送的数据
 * @return		    无
*/
void uart_data_send(uint8_t data_send );

/**@brief		    UART中断使能配置
 *
 * @param[in]	    uart_interrupt     中断类型
 * @param[in]	    interrupt_status     使能/禁止选择
 * @return		    无
*/
void uart_interrupt_config(uart_interrupt_t uart_interrupt,enable_state_t interrupt_status);

/**@brief		    串口FIFO使能
 *
 * @return		    无
*/
void uart_fifo_enable(void);

/**@brief		    关闭串口FIFO
 *
 * @return		    无
*/
void uart_fifo_disable(void);

/**@brief		    读取串口中断ID
 *
 * @param[in]	    interrupt_id     中断类型
 * @return		    选定中断id是否触发，= 1，是，= 0，不是
*/
uint8_t uart_interrupt_id_get (interrupt_id_t interrupt_id);

/**@brief		    设置FIFO接收触发模式
 *
 * @param[in]	    fifo_data_num_receive     串口FIFO接收触发模式选择
 * @return		    无
*/
void uart_fifo_receive_trigger_set (uart_fifo_receive_trigger_t fifo_data_num_receive);

/**@brief		    设置FIFO发送触发模式
 *
 * @param[in]	    fifo_data_num_send     串口FIFO发送触发模式选择
 * @return		    无
*/
void uart_fifo_send_trigger_set (uart_fifo_send_trigger_t fifo_data_num_send);

/**@brief		    获取串口状态
 *
 * @param[in]	    uart_status     串口状态读取选择
 * @return		    返回位 = 0：否， = 1：是
*/
uint8_t uart_status_get (uart_status_get_t uart_status);

/**@brief		    产生break条件
 *
 * @return		    无
*/
void uart_break_set (void);

/**@brief		    配置fifo
 *
 * @param[in]	    uart_config     串口FIFO配置结构体
 * @return		    无
*/
void uart_fifo_config_set (uart_fifo_config_t uart_config);

/**@brief		    获取FIFO状态位
 *
 * @param[in]	    uart_fifo_status     FIFO状态位
 * @return		    返回位 = 0：否， =1：是
*/
uint8_t uart_fifo_status_get (uart_fifo_status_get_t uart_fifo_status);

/**@brief		    确定是否将帧检测和奇偶校验写入FIFO当中，并将data_send送入接收FIFO。
 *
 * @param[in]	    uart_fifo_status     FIFO设置
 * @param[in]	    fifo_status_set     使能/禁止选择
 * @param[in]	    data_send     待发送的数据
 * @return		    无
*/
void uart_fifo_status_set (uart_fifo_status_set_t uart_fifo_status,enable_state_t fifo_status_set,uint8_t data_send);

/**@brief		    获取FIFO发送读状态位
 *
 * @return		    返回位 = 0：未发送，= 1：发送 
*/
uint8_t uart_fifo_send_flag_get (void);

/**@brief		    写入FIFO数据
 *
 * @param[in]	    data_send     FIFO待写入的数据
 * @return		    无
*/
void uart_fifo_data_receive_set (uint8_t data_send);

/**@brief		    读取接收FIFO的数据个数
 *
 * @return		    接收FIFO中的数据个数
*/
uint8_t uart_fifo_receive_number_get (void);

/**@brief		    读取发送FIFO的数据个数
 *
 * @return		    发送FIFO中的数据个数
*/
uint8_t uart_fifo_send_number_get(void);


/*@}*/ /* end of group UART */

#ifdef __cplusplus
}
#endif

#endif  //__CSA37F7X_UART_H__


/*** (C) COPYRIGHT 2020 Chipsea Technologies (Shenzhen) Corp. ***/
